home *** CD-ROM | disk | FTP | other *** search
/ Workbench Design / WB Collection.iso / workbench werkzeuge / bildschirmschoner / bserver_v1.5 / sources.lha / Sources / server / window.c < prev   
C/C++ Source or Header  |  1995-11-08  |  10KB  |  364 lines

  1. #include <exec/types.h>
  2. #include <exec/memory.h>
  3. #include <intuition/intuition.h>
  4. #include <intuition/intuitionbase.h>
  5. #include <intuition/gadgetclass.h>
  6. #include <libraries/commodities.h>
  7. #include <string.h>
  8. #include <stdio.h>
  9.  
  10. #include <proto/exec.h>
  11. #include <proto/commodities.h>
  12. #include <proto/intuition.h>
  13. #include <proto/graphics.h>
  14. #include <proto/gadtools.h>
  15. #include <proto/dos.h>
  16. #include <clib/alib_protos.h>
  17.  
  18. #include "/include/server.h"
  19.  
  20. extern struct List ClientsList;
  21.  
  22. extern UWORD fonth, wleft, wtop, DefaultClient, TotalClients, delaySecs, delayEvents, changeSecs, changeEvents;
  23. extern UBYTE briLevel, sndLevel, BlankStatus;
  24. extern BOOL RandomClient, CommodityActive, StayCool;
  25. extern struct Gadget *glist, *random_gdg, *list_gdg, *args_gdg, *time_gdg, *tchange_gdg, *bri_gdg, *snd_gdg;
  26. extern CxObj *broker;
  27.  
  28. extern struct Screen *WBS;
  29. extern struct VisualInfo *vi;
  30. extern struct TextAttr topazFont;
  31.  
  32. extern BOOL SetUpGadgets(void);
  33. extern void RemoveGadgets(void);
  34.  
  35. extern void AskFiles( void );
  36.  
  37. extern void ClearPendingMessages( struct MsgPort * );
  38.  
  39. extern void StartBlanking( void );
  40. extern void RemoveClient( UWORD, char * );
  41. extern void SendCommandToClient( ULONG );
  42. extern void Quit( void );
  43.  
  44. extern void GetDisplayIDFromNode( UWORD );
  45. extern struct ClientNode *FindClientNode( WORD );
  46. extern struct ModeNode *DisplayNode;
  47. extern ULONG DisplayID;
  48.  
  49. extern char *msg_timeout, *key_timeout, *msg_random, *key_random,
  50.      *msg_hide, *key_hide, *msg_quit, *key_quit, *msg_blank, *key_blank,
  51.      *msg_killsel, *key_killsel, *msg_addcli, *key_addcli,
  52.      *key_changetime, *key_brilevel, *key_sndlevel;
  53.  
  54. extern BOOL stop_on_mouse, stop_on_disk;
  55.  
  56. extern UWORD zoomdims[4];
  57.  
  58. extern struct NewBroker newbroker;
  59.  
  60.  /***************
  61.  *              *
  62.  * WINDOW STUFF *
  63.  *              *
  64.  ***************/
  65.  
  66. struct NewMenu bservernewmenus[] = {
  67.     { NM_TITLE, NULL,         0, 0, 0, 0 },
  68.     { NM_ITEM,  NULL,         0, 0, 0, (APTR)MENUID_ABOUT },
  69.     { NM_ITEM,  NULL,         0, 0, 0, (APTR)MENUID_HIDE },
  70.     { NM_ITEM,  NULL,          0, 0, 0, (APTR)MENUID_QUIT },
  71.     { NM_TITLE, NULL,         0, 0, 0, 0 },
  72.     { NM_ITEM,  NULL,         0, CHECKIT|MENUTOGGLE, 0, (APTR)MENUID_RAWMOUSE },
  73.     { NM_ITEM,  NULL,         0, CHECKIT|MENUTOGGLE, 0, (APTR)MENUID_DISK },
  74.     { NM_END,   NULL,         0, 0, 0, 0 } };
  75.  
  76. struct EasyStruct easyabout = {
  77.     sizeof(struct EasyStruct), 0, "BServer", NULL, NULL };
  78.  
  79. struct Window *window;
  80. UWORD wwidth, wheight;
  81. ULONG windowSignal = NULL;
  82. struct Menu *bsmenus;
  83. struct Screen *wbs;
  84.  
  85.  
  86. void DetachGadgets( void )
  87. {
  88. GT_SetGadgetAttrs( list_gdg, window, NULL, GTLV_Labels, ~0, TAG_END );
  89. }
  90.  
  91.  
  92. void AttachGadgets( void )
  93. {
  94. GT_SetGadgetAttrs( list_gdg, window, NULL, GTLV_Labels, &ClientsList, GTLV_Selected, DefaultClient,    TAG_END );
  95. GT_SetGadgetAttrs( args_gdg, window, NULL, GTST_String, FindClientNode( DefaultClient )->cn_ClientArgs, TAG_END );
  96. }
  97.  
  98.  
  99. BOOL PopUpWindow( void )
  100. {
  101. if ( window )
  102.     {
  103.     ActivateWindow( window );
  104.     WindowToFront( window );
  105.     return( TRUE );
  106.     }
  107.  
  108. if ( wbs = LockPubScreen( NULL ) )
  109.     {
  110.     if ( SetUpGadgets() )
  111.         {
  112.         if ( window = OpenWindowTags( NULL,
  113.             WA_Width, wwidth,
  114.             WA_Height, wheight,
  115.             WA_Left, wleft,
  116.             WA_Top, wtop,
  117.             WA_Gadgets, glist,
  118.             WA_Title, PROGRAMNAME" "PROGRAMVERSION,
  119.             WA_ScreenTitle, newbroker.nb_Title,
  120.             WA_IDCMP, IDCMP_CHANGEWINDOW /*| IDCMP_NEWSIZE*/ | IDCMP_VANILLAKEY | IDCMP_RAWKEY | IDCMP_GADGETUP | IDCMP_CLOSEWINDOW | IDCMP_MENUPICK | INTEGERIDCMP | LISTVIEWIDCMP | BUTTONIDCMP | CHECKBOXIDCMP,
  121.             WA_Flags, WFLG_DEPTHGADGET | WFLG_DRAGBAR | WFLG_CLOSEGADGET | WFLG_ACTIVATE,
  122.             WA_Zoom, zoomdims,
  123.             TAG_END ) )
  124.             {
  125.             if ( bsmenus = CreateMenus( bservernewmenus, TAG_END ) )
  126.                 {
  127.                 if ( LayoutMenus( bsmenus, vi, TAG_END ) )
  128.                     {
  129.                     if ( SetMenuStrip( window, bsmenus ) )
  130.                         {
  131.                         GT_RefreshWindow( window, NULL );
  132.                         windowSignal = 1L << window->UserPort->mp_SigBit;
  133.                         ScreenToFront( wbs );
  134.                         return( TRUE );
  135.                         }
  136.                     }
  137.                 FreeMenus( bsmenus );
  138.                 }
  139.             CloseWindow( window );
  140.             }
  141.         RemoveGadgets();
  142.         }
  143.     UnlockPubScreen( NULL, wbs );
  144.     }
  145. DisplayBeep( NULL );
  146. return( FALSE );
  147. }
  148.  
  149.  
  150. void ShutWindow( void )
  151. {
  152. if ( window )
  153.     {
  154.     ClearMenuStrip( window );
  155.     FreeMenus( bsmenus );
  156.     ClearPendingMessages( window->UserPort );
  157.     wleft = window->LeftEdge;
  158.     wtop = window->TopEdge;
  159.     CloseWindow( window );
  160.     window = NULL;
  161.     windowSignal = NULL;
  162.     RemoveGadgets();
  163.     UnlockPubScreen( NULL, wbs );
  164.     }
  165. }
  166.  
  167.  
  168. void HandleWindowMessages( void )
  169. {
  170. struct IntuiMessage *imsg;
  171. struct MenuItem *item;
  172. ULONG class;
  173. UWORD code;
  174. ULONG addr;
  175. ULONG menuid;
  176.  
  177. while( window && StayCool && ( imsg = GT_GetIMsg( window->UserPort ) ) )
  178.     {
  179.     class = imsg->Class;
  180.     code = imsg->Code;
  181.     addr = (ULONG)imsg->IAddress;
  182.     GT_ReplyIMsg( imsg );
  183.  
  184.     switch( class )
  185.         {
  186.         case IDCMP_CHANGEWINDOW:
  187.             GT_BeginRefresh( window );
  188.             GT_EndRefresh( window, TRUE );
  189.             break;
  190.  
  191.         case IDCMP_MENUPICK:
  192.             while ( window && StayCool && code != MENUNULL )
  193.                 {
  194.                 item = ItemAddress( bsmenus, code );
  195.                 menuid = (ULONG)GTMENUITEM_USERDATA( ItemAddress( bsmenus, code ) );
  196.                 switch ( menuid )
  197.                     {
  198.                     case MENUID_ABOUT:
  199.                         if ( IntuitionBase->LibNode.lib_Version >= 39 )
  200.                             SetWindowPointer( window, WA_BusyPointer, TRUE, TAG_END );
  201.                         EasyRequestArgs( window, &easyabout, NULL, NULL );
  202.                         if ( IntuitionBase->LibNode.lib_Version >= 39 )
  203.                             SetWindowPointer( window, TAG_END );
  204.                         break;
  205.                     case MENUID_HIDE:
  206.                         ShutWindow();
  207.                         break;
  208.                     case MENUID_QUIT:
  209.                         Quit();
  210.                         break;
  211.                     case MENUID_RAWMOUSE:
  212.                         stop_on_mouse = item->Flags & CHECKED ? TRUE : FALSE;
  213.                         break;
  214.                     case MENUID_DISK:
  215.                         stop_on_disk = item->Flags & CHECKED ? TRUE : FALSE;
  216.                         break;
  217.                     }
  218.                 code = item->NextSelect;
  219.                 }
  220.             break;
  221.  
  222.         case IDCMP_RAWKEY:
  223.                 if ( code == 77 )
  224.                     {
  225.                     if ( DefaultClient < TotalClients )
  226.                         {
  227.                         DefaultClient++;
  228.                         GT_SetGadgetAttrs( args_gdg, window, NULL, GTST_String, FindClientNode( DefaultClient )->cn_ClientArgs, TAG_END );
  229.                         GT_SetGadgetAttrs( list_gdg, window, NULL, GTLV_Selected, DefaultClient, GTLV_Top, DefaultClient, TAG_END );
  230.                         }
  231.                     }
  232.                 else if ( code == 76 )
  233.                     {
  234.                     if ( DefaultClient > 0 )
  235.                         {
  236.                         DefaultClient--;
  237.                         GT_SetGadgetAttrs( args_gdg, window, NULL, GTST_String, FindClientNode( DefaultClient )->cn_ClientArgs, TAG_END );
  238.                         GT_SetGadgetAttrs( list_gdg, window, NULL, GTLV_Selected, DefaultClient, GTLV_Top, DefaultClient, TAG_END );
  239.                         }
  240.                     }
  241.                 break;
  242.  
  243.         case IDCMP_VANILLAKEY:
  244.                 code ^= 32;
  245.                 if ( code == *key_timeout )
  246.                     ActivateGadget( time_gdg, window, NULL );
  247.                 else if ( code == *key_changetime )
  248.                     ActivateGadget( tchange_gdg, window, NULL );
  249.                 else if ( code == *key_brilevel )
  250.                     ActivateGadget( bri_gdg, window, NULL );
  251.                 else if ( code == *key_sndlevel )
  252.                     ActivateGadget( snd_gdg, window, NULL );
  253.                 else if ( code == *key_random )
  254.                     {
  255.                     RandomClient ^= TRUE;
  256.                     GT_SetGadgetAttrs( random_gdg, window, NULL, GTCB_Checked, RandomClient, TAG_END );
  257.                     }
  258.                 else if ( code == *key_hide )
  259.                     ShutWindow();
  260.                 else if ( code == *key_quit )
  261.                     Quit();
  262.                 else if ( code == *key_blank )
  263.                     {
  264.                     if ( CommodityActive && BlankStatus == IDLE )
  265.                         {
  266.                         Delay( 10 );
  267.                         BlankStatus = MUST_BLANK;
  268.                         StartBlanking();
  269.                         }
  270.                     }
  271.                 else if ( code == *key_addcli )
  272.                     AskFiles();
  273.                 else if ( code == *key_killsel )
  274.                     RemoveClient( DefaultClient, NULL );
  275.             break;
  276.  
  277.         case IDCMP_REFRESHWINDOW:
  278.             GT_BeginRefresh( window );
  279.             GT_EndRefresh( window, TRUE );
  280.             break;
  281.  
  282.         case IDCMP_CLOSEWINDOW:
  283.             ShutWindow();
  284.             break;
  285.  
  286.         case IDCMP_GADGETUP:
  287.             switch( ((struct Gadget *)addr)->GadgetID )
  288.                 {
  289.                 case TIMEOUT_GDG:
  290.                     delaySecs = ((struct StringInfo *)((struct Gadget *)addr)->SpecialInfo)->LongInt;
  291.                     if ( (WORD)delaySecs < 0 )
  292.                         {
  293.                         delaySecs = 60;
  294.                         GT_SetGadgetAttrs( (struct Gadget *)addr, window, NULL, GTIN_Number, 60, TAG_END );
  295.                         }
  296.                     delayEvents = delaySecs * 10;
  297.                     break;
  298.                 case CHANGETIME_GDG:
  299.                     changeSecs = ((struct StringInfo *)((struct Gadget *)addr)->SpecialInfo)->LongInt;
  300.                     if ( (WORD)changeSecs < 0 )
  301.                         {
  302.                         changeSecs = 0;
  303.                         GT_SetGadgetAttrs( (struct Gadget *)addr, window, NULL, GTIN_Number, 0, TAG_END );
  304.                         }
  305.                     changeEvents = changeSecs * 10;
  306.                     break;
  307.                 case RANDOM_GDG:
  308.                     GT_SetGadgetAttrs( tchange_gdg, window, NULL, GA_Disabled, RandomClient, TAG_END );
  309.                     RandomClient ^= TRUE;
  310.                     break;
  311.                 case HIDE_GDG:
  312.                     ShutWindow();
  313.                     break;
  314.                 case QUIT_GDG:
  315.                     Quit();
  316.                     break;
  317.                 case BLANK_GDG:
  318.                     if ( CommodityActive && BlankStatus == IDLE )
  319.                         {
  320.                         Delay( 10 );
  321.                         BlankStatus = MUST_BLANK;
  322.                         StartBlanking();
  323.                         }
  324.                     break;
  325.                 case MODEID_GDG:
  326.                     GetDisplayIDFromNode( code );
  327.                     break;
  328.                 case ADDCLIENTS_GDG:
  329.                     AskFiles();
  330.                     break;
  331.                 case KILL_GDG:
  332.                     RemoveClient( DefaultClient, NULL );
  333.                     break;
  334.                 case CLIENTARGS_GDG:
  335.                     strcpy( FindClientNode( DefaultClient )->cn_ClientArgs, ((struct StringInfo *)args_gdg->SpecialInfo)->Buffer );
  336.                     break;
  337.                 case LIST_GDG:
  338.                     DefaultClient = code;
  339.                     GT_SetGadgetAttrs( args_gdg, window, NULL, GTST_String, FindClientNode( DefaultClient )->cn_ClientArgs, TAG_END );
  340.                     break;
  341.                 case BRILEVEL_GDG:
  342.                     briLevel = ((struct StringInfo *)((struct Gadget *)addr)->SpecialInfo)->LongInt;
  343.                     if ( briLevel < 0 || briLevel > 100 )
  344.                         {
  345.                         briLevel = 100;
  346.                         GT_SetGadgetAttrs( (struct Gadget *)addr, window, NULL, GTIN_Number, 100, TAG_END );
  347.                         }
  348.                     break;
  349.                 case SNDLEVEL_GDG:
  350.                     sndLevel = ((struct StringInfo *)((struct Gadget *)addr)->SpecialInfo)->LongInt;
  351.                     if ( sndLevel < 0 || sndLevel > 100 )
  352.                         {
  353.                         sndLevel = 100;
  354.                         GT_SetGadgetAttrs( (struct Gadget *)addr, window, NULL, GTIN_Number, 100, TAG_END );
  355.                         }
  356.                     break;
  357.                 }
  358.  
  359.         default:
  360.             break;
  361.         }
  362.     }
  363. }
  364.